home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / cmln0385.arc / DEBUG2.H < prev    next >
Text File  |  1986-02-27  |  5KB  |  192 lines

  1. /* debug2.h -- Control debugging code generation and execution. */
  2. /* by Alexander B. Abacus */
  3. /* This a more portable version of debug.h, debug.h is more readable */
  4.  
  5. /*[ A.0 ] Xfeature defined if feature is absent from environment */
  6.  
  7. #ifndef Xvoid
  8. #ifdef  MSDOS
  9. #define Xvoid
  10. #endif  MSDOS
  11. #endif  Xvoid
  12.  
  13. /*[ A.1 ] Prevent redefinitions. */
  14.  
  15. #ifndef FILE
  16. #ifdef Debug
  17. #include <stdio.h>
  18. #endif defined Debug
  19. #endif ? defined FILE
  20.  
  21. /*[ A.2 ] Localize differences between definitions and declarations. */
  22.  
  23. #ifdef Hdebug
  24. #undef Extern
  25. #undef Init
  26. #endif Hdebug
  27.  
  28. #ifndef DebugAll
  29. #define DebugAll 0
  30. #endif ! defined DebugAll
  31.  
  32. #ifndef Storage
  33. #define Extern extern
  34. #define Init(A_Value)
  35. #else defined Storage ("static" or "")
  36. #define Extern Storage
  37. #define Init(A_Value) = A_Value
  38. #endif ? defined Storage
  39.  
  40. Extern char debug[128] Init( { DebugAll } );
  41.  
  42. #ifndef Hdebug
  43. /* else skip to end of file */
  44. #define Hdebug
  45.  
  46. #define _ ,
  47. /* last definition is necessary for Init( { 1 _ 2 _ 3 } ) */
  48.  
  49. /*[ A.3 ] Localize dependancies on debugging options. */
  50.  
  51. #ifdef Xvoid
  52. #define void int
  53. #endif Xvoid
  54.  
  55. #ifndef Debug
  56. #define DEBUGIN(A_Text)
  57. #define DEBUGOUT(A_Text) A_Text
  58. #define Nothing
  59. #define Void void
  60. #else defined Debug
  61. #define DEBUGIN(A_Text)  A_Text
  62. #define DEBUGOUT(A_Text)
  63. #define Nothing 0
  64. #define Void int
  65. #endif ? defined Debug
  66.  
  67. /*[ A.4 ] Procedure tracing -- entering. */
  68.  
  69. /* EndAutoStorage is only used from START() but is taken out of it because */
  70. /* START() was getting too big for some preprocessors. */
  71.  
  72. #ifndef Debug
  73. #define EndAutoStorage
  74. #else defined Debug
  75. #define EndAutoStorage \
  76. struct { char procId, *procName, *procForm; } thisProc; \
  77. struct { char blockLevel; } thisBlock;
  78. #endif Debug
  79.  
  80. #ifdef Debug
  81. #define START(A_ProcId, A_ProcName, A_ProcForm) EndAutoStorage \
  82. thisProc.procName = A_ProcName; thisProc.procId = ((A_ProcId) % 128); \
  83. thisProc.procForm = A_ProcForm; thisBlock.blockLevel = 1; \
  84. if ( debug[0] || (debug[thisProc.procId % 128] >= 1) ) \
  85. { StdMsg ( stderr , "Procedure entered.\n" ); }
  86. #else
  87. #define START(A_ProcId, A_ProcName, A_ProcForm)
  88. #endif Debug
  89.  
  90. /*[ A.5 ] Annotate error messages. */
  91.  
  92. #ifdef __LINE__
  93. #define StdMsg (void) fprintf \
  94. ( stderr, DEBUGIN("%14s|%4d|%16|%c%d|") DEBUGOUT("%14s|%4d|") , __FILE__, __LINE__ \
  95.   DEBUGIN( _ thisProc.procName _ thisProc.procId _ thisBlock.blockLevel ) \
  96. ); (void) fprintf
  97. #else ! defined __LINE__
  98. #define StdMsg (void) fprintf \
  99. ( stderr, DEBUGIN("%16s|%c%d|") DEBUGOUT("") \
  100.   DEBUGIN( _ thisProc.procName _ thisProc.procId _ thisBlock.blockLevel ) \
  101. ); (void) fprintf
  102. #endif ? defined __LINE__
  103.  
  104. /*[ A.6 ] Selective debugging. */
  105.  
  106. #ifndef Debug
  107. #define DEBUG(A_Level, A_Text)
  108. #else defined Debug
  109. #define DEBUG(A_Level, A_Text) \
  110. if ( debug[0] || (debug[thisProc.procId % 128] >= (A_Level)) ) \
  111. { struct { char blockLevel; } thisBlock; thisBlock.blockLevel = (A_Level); A_Text }
  112. #endif ? defined Debug
  113.  
  114. #define BeginDEBUG(A_Level) \
  115. if ( debug[0] || (debug[thisProc.procId % 128] >= (A_Level)) ) \
  116. { struct { char blockLevel; } thisBlock; thisBlock.blockLevel = (A_Level);
  117.  
  118. #define EndDEBUG }
  119.  
  120. /*[ A.7 ] Procedure tracing -- termination. */
  121.  
  122. #ifndef Debug
  123. #define RETURN(A_Value) return A_Value ;
  124. #else defined Debug
  125. #define RETURN(A_Value) if ( debug[0] || (debug[thisProc.procId % 128] >= 1) ) \
  126. { StdMsg ( stderr , "Procedure returned" ); if ( thisProc.procForm != 0 ) \
  127.   { fprintf ( stderr, thisProc.procForm , A_Value); } fprintf ( stderr, ".\n"); \
  128. } return A_Value ;
  129. #endif ? defined Debug
  130.  
  131. #ifndef Debug
  132. #define EXIT(A_Value) (void) exit((int) (A_Value));
  133. #else defined Debug
  134. #define EXIT(A_Value) if ( debug[0] || (debug[thisProc.procId] >= 1) ) \
  135. { StdMsg ( stderr , "Program terminated normally.\n" ); } \
  136. (void) exit((int)(A_Value));
  137. #endif ? defined Debug
  138.  
  139. #ifndef Debug
  140. #define ABEND(A_Value) (void) exit((int) (A_Value));
  141. #else defined Debug
  142. #define ABEND(A_Value) {StdMsg(stderr, "Program terminated abnormally.\n");} \
  143. (void) exit((int) (A_Value));
  144. #endif ? defined Debug
  145.  
  146. /*[ A.8 ] Assert. */
  147.  
  148. #ifndef Debug
  149. #define ASSERT(A_Predicate)
  150. #else defined Debug
  151. #define ASSERT(A_Predicate) if ( ! (A_Predicate) ) \
  152. { StdMsg ( stderr, "False assertion: (%s).\n", "A_Predicate" ); ABEND(1); }
  153. #endif ? defined Debug
  154.  
  155. #ifdef DriverH
  156.  
  157. #define Storage static
  158.  
  159. /* To compile it with -DDriverH, this file must be renamed into: */
  160. #include "debug.c"
  161.  
  162. char *  echo( string )
  163. char *  string;
  164. { /* echo() */
  165.   START ( 'e', "echo", " \"%s\"" )
  166.   RETURN ( string )
  167. } /* echo() */
  168.  
  169. Void main (argc, argv)
  170. int argc;
  171. char *argv[];
  172. { /* main() */
  173.   int    index;
  174.   START ( 'm', "main", 0 )
  175.  
  176.   DEBUGIN( debug[0] = 0; debug['m'] = 2; debug['e'] = 1; )
  177.   ASSERT (argc > 1)
  178.   for ( (index = 1); (index < argc); (++index) )
  179.   {
  180.                StdMsg ( stderr, "Argument %d is \"%s\".\n", index, argv[index] );
  181.     DEBUG ( 2, StdMsg ( stderr, "Argument %d is \"%s\".\n", index, argv[index] ); )
  182.     (void) echo ( argv[index] );
  183.   }
  184.   EXIT ( 0 );
  185. } /* main */
  186.  
  187. #endif ! defined DriverH
  188.  
  189. #endif ! defined Hdebug
  190.  
  191. /* debug.h -- End of file */
  192.